package com.cantuaria.jsf.dao.support;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import com.cantuaria.jsf.dao.impl.Dao;
import com.cantuaria.jsf.util.HibernateUtil;

/**
 * @autor: Flávio CANTUÁRIA
 * Classe genérica que dá suporte as classes DAO de fazer o CRUD.
 * Ela não será comentada porque presume-se que o desenvolvedor saiba o mínimo de hibernate
 * @param Recebe a classe entidade génerica como parametro em <T>
 * 
 */

public abstract class GenericDao<T> implements Dao<T> {

	protected Session session;
	protected Logger log;
	
	public GenericDao() {
		session = HibernateUtil.getSessionFactory().openSession();
	}
	
	
	public void saveOrUpdate(T instance){
		try {
			session.beginTransaction();
			session.saveOrUpdate(instance);
			session.getTransaction().commit();
			session.close();
		} catch (Exception e) {
			log.error("Erro ao salvar a instancia "+e);
		}		
	}
	
	public abstract Class<T> pegarClasse();
	
	@SuppressWarnings("unchecked")
	public List<T> consultarTodos(){
		try {
			List<T> instance = session.createCriteria(pegarClasse()).list();
			session.close();
			return instance;			
		} catch (Exception e) {
			log.error("Erro ao listar instancias "+e);
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public T consultarId(int id){
		try {
			List<T> instances =  session.createCriteria(pegarClasse())
										.add(Restrictions.eq("id", id)).list();
			return instances.get(0);
		} catch (Exception e) {
			log.error("Erro ao listar a instancia "+e);
			return null;
		}
	}
	
	
	public void deletar(int id){
		try {
			session.beginTransaction();
			session.delete(consultarId(id));
			session.getTransaction().commit();
			session.close();
		} catch (Exception e) {
			log.error("Erro ao deletar a instancia "+e);
		}
	}
	
}
